﻿//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using System.Xml;
//using System.Xml.XPath;
//using System.IO;
//using System.Diagnostics;

//namespace GenericLibrary.Xml.XPath {

//    public class XPathNodeNavigator : XPathNavigator {

//        private IXPathNode _node;

//        public override string BaseURI {
//            get {
//                try {
//                    return this._node.BaseUri;
//                } catch( Exception ) {
//                    Debug.Assert( false );
//                    throw;
//                }
//            }
//        }

//        public override XPathNavigator Clone() {
//            return new XPathNodeNavigator( this._node );
//        }

//        public override bool IsEmptyElement {
//            get {
//                try {
//                    switch( this._node.NodeType ) {
//                        case XPathNodeType.Element:
//                            return this._node.IsEmptyElement;
//                        default:
//                            return false;
//                    }
//                } catch( Exception ) {
//                    Debug.Assert( false );
//                    throw;
//                }
//            }
//        }

//        public override bool IsSamePosition( XPathNavigator other ) {
//            try {
//                XPathNodeNavigator _other = other as XPathNodeNavigator;
//                return _other != null && _other._node.IsSamePosition( this._node );
//            } catch( Exception ) {
//                Debug.Assert( false );
//                throw;
//            }
//        }

//        public override string LocalName {
//            get {
//                try {
//                    switch( this._node.NodeType ) {
//                        case XPathNodeType.Attribute:
//                        case XPathNodeType.Element:
//                        case XPathNodeType.Namespace:
//                            return this._node.LocalName;
//                        default:
//                            return string.Empty;
//                    }
//                } catch( Exception ) {
//                    Debug.Assert( false );
//                    throw;
//                }
//            }
//        }

//        public override bool MoveTo( XPathNavigator other ) {
//            try {
//                XPathNodeNavigator _other = other as XPathNodeNavigator;
//                if( _other != null ) {
//                    this._node = _other._node;
//                    return true;
//                }
//                return false;
//            } catch( Exception ) {
//                Debug.Assert( false );
//                throw;
//            }
//        }

//        public override bool MoveToFirstAttribute() {
//            try {
//                switch( this._node.NodeType ) {
//                    case XPathNodeType.Element:
//                        IXPathNode node = this._node.GetFirstAttribute();
//                        if( node == null ) {
//                            return false;
//                        }
//                        if( node.NodeType != XPathNodeType.Attribute ) {
//                            throw new Exception();
//                        }
//                        this._node = node;
//                        return true;
//                    default:
//                        return false;
//                }
//            } catch( Exception ) {
//                Debug.Assert( false );
//                throw;
//            }
//        }

//        public override bool MoveToFirstChild() {
//            try {
//                switch( this._node.NodeType ) {
//                    case XPathNodeType.Element:
//                    case XPathNodeType.Root:
//                        IXPathNode node = this._node.GetFirstChild();
//                        if( node == null ) {
//                            return false;
//                        }
//                        if( node.NodeType != XPathNodeType.Element && node.NodeType != XPathNodeType.Text ) {
//                            throw new Exception();
//                        }
//                        this._node = node;
//                        return true;
//                    default:
//                        return false;
//                }
//            } catch( Exception ) {
//                Debug.Assert( false );
//                throw;
//            }
//        }

//        public override bool MoveToFirstNamespace( XPathNamespaceScope namespaceScope ) {
//            try {
//                switch( this._node.NodeType ) {
//                    case XPathNodeType.Element:
//                        IXPathNode node = this._node.GetFirstNamespace( namespaceScope );
//                        if( node == null ) {
//                            return false;
//                        }
//                        if( node.NodeType != XPathNodeType.Namespace ) {
//                            throw new Exception();
//                        }
//                        this._node = node;
//                        return true;
//                    default:
//                        return false;
//                }
//            } catch( Exception ) {
//                Debug.Assert( false );
//                throw;
//            }
//        }

//        public override bool MoveToId( string id ) {
//            try {
//                IXPathNode node = this._node.GetElementById( id );
//                if( node == null ) {
//                    return false;
//                }
//                if( node.NodeType != XPathNodeType.Element ) {
//                    throw new Exception();
//                }
//                this._node = node;
//                return true;
//            } catch( Exception ) {
//                Debug.Assert( false );
//                throw;
//            }
//        }

//        public override bool MoveToNext() {
//            try {
//                switch( this._node.NodeType ) {
//                    case XPathNodeType.Element:
//                    case XPathNodeType.Text:
//                        IXPathNode node = this._node.GetNextSibling();
//                        if( node == null ) {
//                            return false;
//                        }
//                        if( node.NodeType != XPathNodeType.Element && node.NodeType != XPathNodeType.Text ) {
//                            throw new Exception();
//                        }
//                        this._node = node;
//                        return true;
//                    default:
//                        return false;
//                }
//            } catch( Exception ) {
//                Debug.Assert( false );
//                throw;
//            }
//        }

//        public override bool MoveToNextAttribute() {
//            try {
//                switch( this._node.NodeType ) {
//                    case XPathNodeType.Attribute:
//                        IXPathNode node = this._node.GetNextAttribute();
//                        if( node == null ) {
//                            return false;
//                        }
//                        if( node.NodeType != XPathNodeType.Attribute ) {
//                            throw new Exception();
//                        }
//                        this._node = node;
//                        return true;
//                    default:
//                        return false;
//                }
//            } catch( Exception ) {
//                Debug.Assert( false );
//                throw;
//            }
//        }

//        public override bool MoveToNextNamespace( XPathNamespaceScope namespaceScope ) {
//            try {
//                switch( this._node.NodeType ) {
//                    case XPathNodeType.Namespace:
//                        IXPathNode node = this._node.GetNextNamespace( namespaceScope );
//                        if( node == null ) {
//                            return false;
//                        }
//                        if( node.NodeType != XPathNodeType.Namespace ) {
//                            throw new Exception();
//                        }
//                        this._node = node;
//                        return true;
//                    default:
//                        return false;
//                }
//            } catch( Exception ) {
//                Debug.Assert( false );
//                throw;
//            }
//        }

//        public override bool MoveToParent() {
//            try {
//                IXPathNode node;
//                switch( this._node.NodeType ) {
//                    case XPathNodeType.Element:
//                        node = this._node.GetParent();
//                        if( node != null && ( node.NodeType == XPathNodeType.Element || node.NodeType == XPathNodeType.Root ) ) {
//                            this._node = node;
//                            return true;
//                        }
//                        throw new Exception();
//                    case XPathNodeType.Text:
//                    case XPathNodeType.Attribute:
//                    case XPathNodeType.Namespace:
//                        node = this._node.GetParent();
//                        if( node != null && node.NodeType == XPathNodeType.Element ) {
//                            this._node = node;
//                            return true;
//                        }
//                        throw new Exception();
//                    default:
//                        return false;
//                }
//            } catch( Exception ) {
//                Debug.Assert( false );
//                throw;
//            }
//        }

//        public override bool MoveToPrevious() {
//            try {
//                switch( this._node.NodeType ) {
//                    case XPathNodeType.Element:
//                    case XPathNodeType.Text:
//                        IXPathNode node = this._node.GetPreviousSibling();
//                        if( node == null ) {
//                            return false;
//                        }
//                        if( node.NodeType != XPathNodeType.Element && node.NodeType != XPathNodeType.Text ) {
//                            throw new Exception();
//                        }
//                        this._node = node;
//                        return true;
//                    default:
//                        return false;
//                }
//            } catch( Exception ) {
//                Debug.Assert( false );
//                throw;
//            }
//        }

//        public override string Name {
//            get {
//                try {
//                    switch( this._node.NodeType ) {
//                        case XPathNodeType.Element:
//                        case XPathNodeType.Attribute:
//                            string prefix = this._node.Prefix;
//                            if( prefix != null && prefix.Length > 0 ) {
//                                return this._node.Prefix + ":" + this._node.LocalName;
//                            } else {
//                                return this._node.LocalName;
//                            }
//                        case XPathNodeType.Namespace:
//                            return this._node.LocalName;
//                        default:
//                            return string.Empty;
//                    }
//                } catch( Exception ) {
//                    Debug.Assert( false );
//                    throw;
//                }
//            }
//        }

//        public override XmlNameTable NameTable {
//            get {
//                try {
//                    return this._node.NameTable;
//                } catch( Exception ) {
//                    Debug.Assert( false );
//                    throw;
//                }
//            }
//        }

//        public override string NamespaceURI {
//            get {
//                try {
//                    switch( this._node.NodeType ) {
//                        case XPathNodeType.Element:
//                        case XPathNodeType.Attribute:
//                            return this._node.NamespaceUri;
//                        default:
//                            return string.Empty;
//                    }
//                } catch( Exception ) {
//                    Debug.Assert( false );
//                    throw;
//                }
//            }
//        }

//        public override XPathNodeType NodeType {
//            get {
//                try {
//                    return this._node.NodeType;
//                } catch( Exception ) {
//                    Debug.Assert( false );
//                    throw;
//                }
//            }
//        }

//        public override string Prefix {
//            get {
//                try {
//                    switch( this._node.NodeType ) {
//                        case XPathNodeType.Element:
//                        case XPathNodeType.Attribute:
//                            return this._node.Prefix;
//                        default:
//                            return string.Empty;
//                    }
//                } catch( Exception ) {
//                    Debug.Assert( false );
//                    throw;
//                }
//            }
//        }

//        public override string Value {
//            get {
//                try {
//                    switch( this._node.NodeType ) {
//                        case XPathNodeType.Attribute:
//                        case XPathNodeType.Text:
//                        case XPathNodeType.Namespace:
//                            return this._node.Value;
//                        case XPathNodeType.Element:
//                        case XPathNodeType.Root:
//                            string s = "";
//                            XPathNavigator clone = this.Clone();
//                            if( clone.MoveToFirstChild() ) {
//                                do {
//                                    s += clone.Value;
//                                } while( clone.MoveToNext() );
//                            }
//                            return s;
//                        default:
//                            return string.Empty;
//                    }
//                } catch( Exception ) {
//                    Debug.Assert( false );
//                    throw;
//                }
//            }
//        }

//        public override bool CanEdit {
//            get {
//                try {
//                    return this._node.CanEdit;
//                } catch( Exception ) {
//                    Debug.Assert( false );
//                    throw;
//                }
//            }
//        }

//        public override void CreateAttribute( string prefix, string localName, string namespaceURI, string value ) {
//            try {
//                if( this._node.CanEdit ) {
//                    switch( this._node.NodeType ) {
//                        case XPathNodeType.Element:
//                            this._node.CreateAttribute( prefix, localName, namespaceURI, value );
//                            return;
//                        default:
//                            return;
//                    }
//                }
//            } catch( Exception ) {
//                Debug.Assert( false );
//                throw;
//            }
//        }

//        public override void AppendChildElement( string prefix, string localName, string namespaceURI, string value ) {
//            try {
//                if( this._node.CanEdit ) {
//                    switch( this._node.NodeType ) {
//                        case XPathNodeType.Element:
//                            this._node.AppendChild( prefix, localName, namespaceURI, value );
//                            return;
//                        default:
//                            return;
//                    }
//                }
//            } catch( Exception ) {
//                Debug.Assert( false );
//                throw;
//            }
//        }

//        public override void PrependChildElement( string prefix, string localName, string namespaceURI, string value ) {
//            try {
//                if( this._node.CanEdit ) {
//                    switch( this._node.NodeType ) {
//                        case XPathNodeType.Element:
//                            IXPathNode firstChild = this._node.GetFirstChild();
//                            if( firstChild == null ) {
//                                this._node.AppendChild( prefix, localName, namespaceURI, value );
//                            } else {
//                                firstChild.InsertSibling( prefix, localName, namespaceURI, value );
//                            }
//                            return;
//                        default:
//                            return;
//                    }
//                }
//            } catch( Exception ) {
//                Debug.Assert( false );
//                throw;
//            }
//        }

//        public override void InsertElementBefore( string prefix, string localName, string namespaceURI, string value ) {
//            try {
//                if( this._node.CanEdit ) {
//                    switch( this._node.NodeType ) {
//                        case XPathNodeType.Element:
//                            if( this._node.Parent.NodeType != XPathNodeType.Root ) {
//                                this._node.InsertSibling( prefix, localName, namespaceURI, value );
//                            }
//                            return;
//                        case XPathNodeType.Text:
//                            this._node.InsertSibling( prefix, localName, namespaceURI, value );
//                            return;
//                        default:
//                            return;
//                    }
//                }
//            } catch( Exception ) {
//                Debug.Assert( false );
//                throw;
//            }
//        }

//        public override void InsertElementAfter( string prefix, string localName, string namespaceURI, string value ) {
//            try {
//                if( this._node.CanEdit ) {
//                    switch( this._node.NodeType ) {
//                        case XPathNodeType.Element:
//                            if( this._node.Parent.NodeType != XPathNodeType.Root ) {
//                                IXPathNode nextSibling = this._node.Next;
//                                if( nextSibling == null ) {

//                                }
//                            }
//                            return;
//                        case XPathNodeType.Text:

//                        default:
//                            return;
//                    }
//                }
//            } catch( Exception ) {
//                Debug.Assert( false );
//                throw;
//            }
//        }

//        internal XPathNodeNavigator( IXPathNode node ) {
//            this._node = node;
//        }
//    }

//}
